package com.ruoyi.smart.service.impl;

import java.util.List;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.smart.config.CouchDBService;
import com.ruoyi.smart.service.ISmartProductTestRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.smart.mapper.SmartModDataMapper;
import com.ruoyi.smart.domain.SmartModData;
import com.ruoyi.smart.service.ISmartModDataService;

/**
 * 产品测试数据Service业务层处理
 * 
 * @author ruoyi
 * @date 2022-06-30
 */
@Service
public class SmartModDataServiceImpl implements ISmartModDataService 
{
    @Autowired
    private SmartModDataMapper smartModDataMapper;
    @Autowired
    private ISmartProductTestRecordService smartProductTestRecordService;
    @Autowired
    private CouchDBService couchDBService;
    /**
     * 查询产品测试数据
     * 
     * @param id 产品测试数据主键
     * @return 产品测试数据
     */
    @Override
    public SmartModData selectSmartModDataById(Long id)
    {
        SmartModData smartModData=smartModDataMapper.selectSmartModDataById(id);
        smartModData.setModStr(couchDBService.getString(smartModData.getModStr()));
        smartModData.setModList(couchDBService.getString(smartModData.getModList()));
        smartModData.setData(couchDBService.getString(smartModData.getData()));
        return smartModData;
    }

    /**
     * 查询产品测试数据列表
     * 
     * @param smartModData 产品测试数据
     * @return 产品测试数据
     */
    @Override
    public List<SmartModData> selectSmartModDataList(SmartModData smartModData)
    {
        List<SmartModData> list=smartModDataMapper.selectSmartModDataList(smartModData);
        for(SmartModData item : list){
            item.setModStr(couchDBService.getString(item.getModStr()));
            item.setModList(couchDBService.getString(item.getModList()));
            item.setData(couchDBService.getString(item.getData()));
        }
        return list;
    }

    /**
     * 查询产品测试数据列表前10条
     *
     * @param smartModData 产品测试数据
     * @return 产品测试数据
     */
    @Override
    public List<SmartModData> selectSmartModDataListTop10(SmartModData smartModData)
    {
        List<SmartModData> list=smartModDataMapper.selectSmartModDataListTop10(smartModData);
        for(SmartModData item : list){
            item.setModStr(couchDBService.getString(item.getModStr()));
            item.setModList(couchDBService.getString(item.getModList()));
            item.setData(couchDBService.getString(item.getData()));
        }
        return list;
    }

    /**
     * 查询产品测试数据列表前1000条数据
     *
     * @param smartModData 产品测试数据
     * @return 产品测试数据集合
     */
    @Override
    public List<SmartModData> selectSmartModDataListTop1000(SmartModData smartModData){
        List<SmartModData> list=smartModDataMapper.selectSmartModDataListTop1000(smartModData);
        for(SmartModData item : list){
            item.setModStr(couchDBService.getString(item.getModStr()));
            item.setModList(couchDBService.getString(item.getModList()));
            item.setData(couchDBService.getString(item.getData()));
        }
        return list;
    }


    /**
     * 查询产品测试数据列表前10条
     *
     * @param smartModData 产品测试数据
     * @return 产品测试数据
     */
    @Override
    public JSONArray selectSmartModDataListTop10Mtr(SmartModData smartModData)
    {
        JSONArray jsonArray=new JSONArray();
        smartModData.setType("mtr");
        List<SmartModData> data=this.selectSmartModDataListTop10(smartModData);
        for(SmartModData item : data){
            if(item.getData()!=null){
                item.setData(item.getData().replace("时间","DateTime"));
                item.setData(item.getData().replace("开关ID","productId"));
                item.setData(item.getData().replace("雷管","detonator"));
                item.setData(item.getData().replace("平均电流","avg_current"));
                item.setData(item.getData().replace("平均电压","avg_voltage"));
                item.setData(item.getData().replace("最高电流","max_current"));
                item.setData(item.getData().replace("最高电压","max_voltage"));
                item.setData(item.getData().replace("级联电流","cascade_current"));
                item.setData(item.getData().replace("测试结果","test_result"));
                JSONObject o=JSONObject.parseObject(item.getData());
                if(o.containsKey("data"))
                {
                    jsonArray.addAll(o.getJSONArray("data"));
                }
            }
        }
        return jsonArray;
    }

    /**
     * 查询产品测试数据列表前10条类型Mtr
     *
     * @param smartModData 产品测试数据
     * @return 产品测试数据集合
     */
    public JSONObject selectSmartModDataGdf(SmartModData smartModData){
        JSONArray x_axis =new JSONArray();
        JSONArray c_data =new JSONArray();
        JSONArray v_data =new JSONArray();
        smartModData.setType("gdf");
        List<SmartModData> data=this.selectSmartModDataListTop10(smartModData);
        if(data.size()>0){
            SmartModData item=data.get(0);
            item.setData(item.getData().replace("\\n",""));
            JSONArray jsonArray=JSONArray.parseArray(item.getData());
            for(int i=0;i<jsonArray.size();i++){
                JSONObject jsonObject=jsonArray.getJSONObject(i);
                x_axis.add(jsonObject.getString("time"));
                c_data.add(jsonObject.getString("current"));
                v_data.add(jsonObject.getString("voltage"));
            }
        }
        JSONObject o=new JSONObject();
        o.put("x_axis",x_axis);
        o.put("c_data",c_data);
        o.put("v_data",v_data);
        return o;
    }




    /**
     * 新增产品测试数据
     * 
     * @param smartModData 产品测试数据
     * @return 结果
     */
    @Override
    public int insertSmartModData(SmartModData smartModData)
    {
        String key=couchDBService.insert(smartModData);
        smartModData.setData(couchDBService.insert(smartModData.getData()));
        smartModData.setModList(couchDBService.insert(smartModData.getModList()));
        smartModData.setModStr(couchDBService.insert(smartModData.getModStr()));
        return smartModDataMapper.insertSmartModData(smartModData);
    }

    /**
     * 修改产品测试数据
     * 
     * @param smartModData 产品测试数据
     * @return 结果
     */
    @Override
    public int updateSmartModData(SmartModData smartModData)
    {
        SmartModData temp=smartModDataMapper.selectSmartModDataById(smartModData.getId());
        smartModData.setData(couchDBService.update(temp.getData(),smartModData.getData()));
        smartModData.setModList(couchDBService.update(temp.getModList(),smartModData.getModList()));
        smartModData.setModStr(couchDBService.update(temp.getModStr(),smartModData.getModStr()));
        return smartModDataMapper.updateSmartModData(smartModData);
    }

    /**
     * 批量删除产品测试数据
     * 
     * @param ids 需要删除的产品测试数据主键
     * @return 结果
     */
    @Override
    public int deleteSmartModDataByIds(Long[] ids)
    {
        List<SmartModData> list=smartModDataMapper.selectSmartModDataByIds(ids);
        for(SmartModData item : list){
            couchDBService.delete(item.getData());
            couchDBService.delete(item.getModStr());
            couchDBService.delete(item.getModList());
        }
        return smartModDataMapper.deleteSmartModDataByIds(ids);
    }

    /**
     * 删除产品测试数据信息
     * 
     * @param id 产品测试数据主键
     * @return 结果
     */
    @Override
    public int deleteSmartModDataById(Long id)
    {
        SmartModData smartModData=smartModDataMapper.selectSmartModDataById(id);
        couchDBService.delete(smartModData.getData());
        couchDBService.delete(smartModData.getModStr());
        couchDBService.delete(smartModData.getModList());
        return smartModDataMapper.deleteSmartModDataById(id);
    }

    /**
     * 设置产品
     */
    @Override
    public void setProductState(List<SmartModData> list){
        for(SmartModData item : list){
            //TODO 取modstr 和 modlist数据
//            smartProductTestRecordService.setState(JSONObject.parseObject(item.getData()));
            smartProductTestRecordService.setState(item);
            item.setState("1");
            this.updateSmartModData(item);
        }
    }

    /**
     * 把大部分文本数据拷贝到couchDB
     * 此方法将数据全部转换之后将不再使用
     */
    @Override
    public void copyDataToCouchDB(){
        SmartModData smartModData=new SmartModData();
        smartModData.setState("3");
        while (true){
            List<SmartModData> list=smartModDataMapper.selectSmartModDataListTop1000(smartModData);
            if(list.size()<1) break;
            for(SmartModData item : list){
                item.setState("3");
                item.setData(couchDBService.insert(item.getData()));
                item.setModList(couchDBService.insert(item.getModList()));
                item.setModStr(couchDBService.insert(item.getModStr()));
                smartModDataMapper.updateSmartModData(item);
            }
        }

    }
}
